package jwt

import (
	"errors"
	"github.com/golang-jwt/jwt/v4"
	"time"
	"vpom_-system/global"
	"vpom_-system/model/request"
	"vpom_-system/utils"
)

var (
	TokenExpired     = errors.New("Token  已过期")
	TokenNotValidYet = errors.New("Token  不可用")
	TokenMalformed   = errors.New("Token  格式错误")
	TokenInvalid     = errors.New("Token  无效")
)

type JWT struct {
	AccessTokenSecret  []byte
	RefreshTokenSecret []byte
}

// NewJWT 返回一个jwt实例对象
func NewJWT() *JWT {
	return &JWT{
		AccessTokenSecret:  []byte(global.Config.Jwt.AccessTokenSecret),
		RefreshTokenSecret: []byte(global.Config.Jwt.RefreshTokenSecret),
	}
}

// CreateAccessToken 创建 Access Token
func (j *JWT) CreateAccessToken(req request.JwtAccessClaims) (string, error) {
	// 获取过期时间
	ep, _ := utils.ParseDuration(global.Config.Jwt.AccessTokenExpireTime)

	// 获取jwt的claims部分
	claims := request.JwtAccessClaims{
		UserID: req.UserID,
		RegisteredClaims: jwt.RegisteredClaims{
			Audience:  jwt.ClaimStrings{"TAP"},                // 受众
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(ep)), // 过期时间
			Issuer:    global.Config.Jwt.Issuer,               // 签名的发行者
		},
	}
	// 创建AccessToken
	AccessToken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 创建新的 JWT Token

	return AccessToken.SignedString(j.AccessTokenSecret)
}

// CreateRefreshToken 创建 RefreshToken
func (j *JWT) CreateRefreshToken(req request.JwtRefreshClaims) (string, error) {
	// 获取过期时间
	ep, _ := utils.ParseDuration(global.Config.Jwt.RefreshTokenExpireTime)

	// 获取jwt的claims部分
	claims := request.JwtRefreshClaims{
		UserID: req.UserID,
		RegisteredClaims: jwt.RegisteredClaims{
			Audience:  jwt.ClaimStrings{"TAP"},                // 受众
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(ep)), // 过期时间
			Issuer:    global.Config.Jwt.Issuer,               // 签名的发行者
		},
	}

	// 创建RefreshToken
	RefreshToken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 创建新的 JWT Token
	return RefreshToken.SignedString(j.AccessTokenSecret)
}
